﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Siser.Web.Models;
using Siser.Web.Security;
using System.Data.Objects.SqlClient;

namespace Siser.Web.Authorization
{
    public static class Membership
    {
        private static SiserEntities db = new SiserEntities();

        public static Usuario getUsuarioByUsuarioNameAndCoordenadas(Login login)
        {
            var empleado = (from u in db.Usuarios
                            join e in db.Empleados on u.EmpleadoId equals e.Id
                            join t in db.TarjetasIdentificaciones on u.Id equals t.UsuarioId
                            join c in db.Coordenadas on t.Id equals c.TarjetaIdentificacionId
                            join c1 in db.Coordenadas on t.Id equals c1.TarjetaIdentificacionId
                            join c2 in db.Coordenadas on t.Id equals c2.TarjetaIdentificacionId
                            where u.Nombre == login.UserName
                                && u.Vigencia == true
                                && t.Vigencia == true
                                && c.I == login.PrimeraCoordenada.I
                                && c.J == login.PrimeraCoordenada.J
                                && c.Valor == login.PrimeraCoordenada.Valor
                                && c1.I == login.SegundaCoordenada.I
                                && c1.J == login.SegundaCoordenada.J
                                && c1.Valor == login.SegundaCoordenada.Valor
                                && c2.I == login.TerceraCoordenada.I
                                && c2.J == login.TerceraCoordenada.J
                                && c2.Valor == login.TerceraCoordenada.Valor
                            select u
                             ).First();

            return empleado;
        }

        public static bool validateCoordenadas(Login login)
        {
            var coordenadas = (from t in db.TarjetasIdentificaciones
                               join u in db.Usuarios on t.UsuarioId equals u.Id
                               join c in db.Coordenadas on t.Id equals c.TarjetaIdentificacionId
                               join c1 in db.Coordenadas on t.Id equals c1.TarjetaIdentificacionId
                               join c2 in db.Coordenadas on t.Id equals c2.TarjetaIdentificacionId
                               where u.Nombre == login.UserName
                                  && u.Vigencia == true
                                  && t.Vigencia == true
                                  && c.I == login.PrimeraCoordenada.I
                                  && c.J == login.PrimeraCoordenada.J
                                  && c.Valor == login.PrimeraCoordenada.Valor
                                  && c1.I == login.SegundaCoordenada.I
                                  && c1.J == login.SegundaCoordenada.J
                                  && c1.Valor == login.SegundaCoordenada.Valor
                                  && c2.I == login.TerceraCoordenada.I
                                  && c2.J == login.TerceraCoordenada.J
                                  && c2.Valor == login.TerceraCoordenada.Valor
                               select c).ToList();

            if (coordenadas.ToList().Count == 1)
                return true;
            else
                return false;

        }

        public static bool ValidateIngresoTransitorio(Login login)
        {
            List<Usuario> users = (
                                      from u in db.Usuarios
                                      where u.Nombre == login.UserName && u.Vigencia == true
                                      select u
                                ).ToList();

            List<Usuario> usuario = null;
            if (users.Count == 1)
            {
                
                Usuario user = users.ElementAt(0);

                var pass = Encryption.encryptSha1(login.Password);
                usuario = (
                                from u in db.Usuarios
                                join it in db.ingresos_transitorios on u.Id equals it.usuario_id
                                where it.vigencia == true && it.contrasena_transitoria == pass && u.Id == user.Id
                                && SqlFunctions.DateDiff("year", DateTime.Now, it.fecha_creacion) == 0
                                && SqlFunctions.DateDiff("month", DateTime.Now, it.fecha_creacion) == 0
                                && SqlFunctions.DateDiff("day", DateTime.Now, it.fecha_creacion) == 0
                                && SqlFunctions.DateDiff("hour", DateTime.Now, it.fecha_creacion) == 0
                                && SqlFunctions.DateDiff("minute", DateTime.Now, it.fecha_creacion) <= 15
                                select u
                              ).ToList();

            }

            if (usuario != null && usuario.Count == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public static bool ValidateUser(Login login)
        {
            var password = Encryption.encryptSha1(login.Password);

            var coordenadas = (from t in db.TarjetasIdentificaciones
                               join u in db.Usuarios on t.UsuarioId equals u.Id
                               join c in db.Coordenadas on t.Id equals c.TarjetaIdentificacionId
                               join c1 in db.Coordenadas on t.Id equals c1.TarjetaIdentificacionId
                               join c2 in db.Coordenadas on t.Id equals c2.TarjetaIdentificacionId
                               where u.Nombre == login.UserName
                                  && u.Contrasena == password
                                  && u.Vigencia == true
                                  && t.Vigencia == true
                                  && c.I == login.PrimeraCoordenada.I
                                  && c.J == login.PrimeraCoordenada.J
                                  && c.Valor == login.PrimeraCoordenada.Valor
                                  && c1.I == login.SegundaCoordenada.I
                                  && c1.J == login.SegundaCoordenada.J
                                  && c1.Valor == login.SegundaCoordenada.Valor
                                  && c2.I == login.TerceraCoordenada.I
                                  && c2.J == login.TerceraCoordenada.J
                                  && c2.Valor == login.TerceraCoordenada.Valor
                               select c).ToList();
            if (coordenadas.ToList().Count == 1)
                return true;
            else
                return false;
        }

        public static List<Sistema> Getfuncionalidades(string userName)
        {
            var sistemas = (from u in db.Usuarios
                            join r in db.Roles on u.RolId equals r.Id
                            join rf in db.RolesFuncionalidades on r.Id equals rf.RolId
                            join f in db.Funcionalidades on rf.FuncionalidadId equals f.Id
                            join s in db.Sistemas on f.SistemaId equals s.Id
                            where u.Nombre == userName
                               && f.Visible == true
                               && r.Vigencia == true
                               && u.Vigencia == true
                            orderby s.Nombre ascending
                            select s).Distinct().ToList<Sistema>();

            foreach (Sistema sistema in sistemas)
            {
                sistema.Funcionalidades = (from u in db.Usuarios
                                           join r in db.Roles on u.RolId equals r.Id
                                           join rf in db.RolesFuncionalidades on r.Id equals rf.RolId
                                           join f in db.Funcionalidades on rf.FuncionalidadId equals f.Id
                                           where u.Nombre == userName
                                              && f.Visible == true
                                              && r.Vigencia == true
                                              && u.Vigencia == true
                                              && f.Sistema.Id == sistema.Id
                                              && f.FuncionalidadPadre == null
                                           orderby f.Orden ascending
                                           select f).Distinct().ToList<Funcionalidad>();

                foreach (Funcionalidad funcionalidad in sistema.Funcionalidades)
                {
                    funcionalidad.Funcionalidades = (from u in db.Usuarios
                                                     join r in db.Roles on u.RolId equals r.Id
                                                     join rf in db.RolesFuncionalidades on r.Id equals rf.RolId
                                                     join f in db.Funcionalidades on rf.FuncionalidadId equals f.Id
                                                     where u.Nombre == userName
                                                         && f.Visible == true
                                                         && r.Vigencia == true
                                                         && u.Vigencia == true
                                                         && f.Sistema.Id == sistema.Id
                                                         && f.FuncionalidadPadre.Id == funcionalidad.Id
                                                     orderby f.Orden ascending
                                                     select f).Distinct().ToList<Funcionalidad>();
                }
            }

            return sistemas.ToList<Sistema>();
        }

        public static string ConvertNumberToLetter(int number)
        {
            switch (number)
            {
                case 1: return "A";
                case 2: return "B";
                case 3: return "C";
                case 4: return "D";
                case 5: return "E";
                default: return "A";
            }
        }
    }
}